package io.bio;

import java.nio.Buffer;
import java.nio.IntBuffer;

public class BufferDemo {
    public static void main(String[] args) {
        System.out.println("=========================初始化=======================");
        // 在初始化的时候会分配按照传入的参数分配内存大小，以下代码的意思就是 在内存中分配 （20*int类型的字节数）的大小
        IntBuffer buffer = IntBuffer.allocate(20);

        System.out.println("=========================读取属性值=======================");
        // 容量，初始化的时候分配，一旦分配完成不能修改
        System.out.println(buffer.capacity());
        // 指针指向，容量分配完成后默认指向可写入的起始位置0，最大 为capacity-1
        System.out.println(buffer.position());
        // 可操作的上线，在写模式下，limit=capacity,当时使用flip()函数转变成读模式的时候，limit=写模式下最后的position
        System.out.println(buffer.limit());
        // 标记位，记录当前position的位置，和reset()配合使用，可以让position 返回到 指定的位置
        System.out.println(buffer.mark());


        System.out.println("=========================写数据=======================");
        // 写数据
        for (int i = 0; i < 5; i++) {
            buffer.put(i);
        }


        System.out.println("=========================flip()函数切换到读模式=======================");
        // 读数据，再读数据之前要使用flip()函数将写模式切换到读模式 这里切换到读模式的本质就是讲position 设置到最初的状态，
        // 使用clear()函数同样也能够实现，不过查看源码可以看到，flip()函数将 limit设值成了position 而clear 将 limit 设值成了 capacity
        // 这也就是他们的不同之处，如果使用clear 切换到读模式，则无论最后是否有值都可以读取到最后，而使用flip切换到读模式的话，
        // 只能读取到limit的位置（从1 开始）

        buffer.flip();
        printProperties(buffer);
        System.out.println("=========================读取数据=======================");
        // 读数据
        for (int i = 0; i < 5; i++) {
            System.out.println(buffer.get());
        }

        System.out.println("=========================rewind() 重置 position 后 读数据=======================");
        // rewind()函数将position设值为0，表示又可以从头开始读或者是写，但是这个方法不修改limit值，所以调用该方法后仍然不能操作超过limit限制的区域
        buffer.rewind();
        for (int i = 0; i < 5; i++) {
            System.out.println(buffer.get());
        }

        System.out.println("=========================mark()=======================");
        buffer.flip();
        for (int i = 0; i < 5; i++) {
            System.out.println(buffer.get());
            if (i==2){
                // 记录当前position 所在的位置当调用reset()方法的时候会将position 复位
                buffer.mark();
            }
        }
        System.out.println("=========================reset()=======================");
        // 将position 复位到之前mark 标记的地方
        buffer.reset();
        System.out.println(buffer.get());

        System.out.println("=========================切换后写模式=======================");
        // 由于对limit 操作方法的不一样，所以flip() 方法用于从写模式切换到读模式，clear()和compact()用于从读模式切换到写模式
        buffer.clear();
        buffer.compact();

    }


    public static void printProperties(Buffer buffer){
        System.out.println("=========================读取属性值=======================");
        System.out.println(buffer.capacity());
        // 指针指向，容量分配完成后默认指向可写入的起始位置0，最大 为capacity-1
        System.out.println(buffer.position());
        // 可操作的上线，在写模式下，limit=capacity,当时使用flip()函数转变成读模式的时候，limit=写模式下最后的position
        System.out.println(buffer.limit());
        // 标记位，记录当前position的位置，和reset()配合使用，可以让position 返回到 指定的位置
        System.out.println(buffer.mark());
    }

}
